MATLAB是现代科技中最常用的编程语言之一,广泛应用于科学计算、图形处理、机器学习等领域。其中,bwtraceboundary函数是一个非常重要的函数,可以用来跟踪二值图像的边界线。本文将介绍如何使用MATLAB中的bwtraceboundary函数来跟踪边界线。
一、什么是bwtraceboundary函数?
bwtraceboundary函数是MATLAB中的一个函数,用于跟踪二值图像的边界线。其中,二值图像是指只有两个亮度值(即黑和白)的图像。bwtraceboundary函数通常被用在数字图像处理和计算机视觉中。
二、bwtraceboundary函数的基本用法
bwtraceboundary函数的基本用法很简单,只需要输入二值图像和跟踪起点的坐标,就可以得到边界线的坐标序列。
语法格式如下:
BW = bwtraceboundary(BW, [r, c], direction, connectivity, maxPoints);
其中,
● BW:输入的二值图像矩阵,必须是逻辑矩阵(即0或1);
● [r,c]:跟踪起点的坐标,必须是一个长度为2的二元向量,例如[r,c]=[10,20];
● direction:确定跟踪的方向,可以是8个连通域之一,取值为N、NE、E、SE、S、SW、W、NW。默认设置为第8个连通域(也就是NW);
● connectivity:选择连通域的方式,可以是4或8。默认值是8;
● maxPoints:跟踪的最大点数。默认值是无穷大。
例如,下面代码段中,我们使用bwtraceboundary函数来跟踪一个名为testImage的二值图像中的边界线,并将结果显示在图像上。
clear;clc;
testImage = imread('circles.png');
bw = im2bw(testImage, 0.5);
[r,c] = find(bw);
idx = sub2ind(size(bw),r,c);
bw_2d = false(size(bw));
bw_2d(idx) = true;
bw = bw_2d;
[row, col] = find(bw);
BW=bwtraceboundary(bw, [row(1), col(1)], 'W',8);
imshow(bw); hold on;
plot(BW(:,2),BW(:,1),'r','linewidth',1.5);
hold off;
运行结果如下图所示:
三、bwtraceboundary函数的参数说明
1、起始坐标
bwtraceboundary函数需要一个起始坐标作为跟踪的起点。这个坐标必须在二值图像中的前景区域(即1)上。通常情况下,我们可以使用imfindcircles函数来自动检测圆形物体的中心点,并将其作为跟踪的起始坐标。
2、跟踪方向
bwtraceboundary函数使用迭代算法来跟踪边界线,其中包括一个跟踪方向参数。跟踪方向分为八个连通域(N、NE、E、SE、S、SW、W、NW)。
默认方向为NW。
需要注意的是,边界线可能沿多条方向延伸,因此初始选择的方向可能会影响最终结果。
3、连通域
bwtraceboundary函数跟踪的时候,需要决定连通域的方式。这是通过设置connectivity参数来实现的。通常情况下,我们使用8连通域(即沿着八个方向连接)来跟踪边界线。
4、最大点数
为了避免迭代次数过多,我们可以设置bwtraceboundary函数的最大跟踪点数。当跟踪的点数达到最大限制时,迭代过程会停止。
四、使用bwtraceboundary函数跟踪边界线的示例
下面,我们将展示一个例子,通过bwtraceboundary函数来跟踪一个形状复杂的边界线。
首先,我们需要创建一个随机生成的二值图像。代码如下:
I = im2bw(imread('test.jpg'), 0.5);
[nrows,ncols] = size(I);
% create a random polygon for tracing
numVertices = 10;
xV = [1,round(rand(1,numVertices-1)*(ncols-1)+1)];
yV = [1,round(rand(1,numVertices-1)*(nrows-1)+1)];
bw2 = poly2mask(xV,yV,nrows,ncols);
bw3 = imfill(bw2,'holes');
bw4 = I & ~ bw3;
运行结果如下图所示。
图片来自:
https://www.mathworks.com/help/images/bwtraceboundary.html
我们可以使用bwtraceboundary函数来跟踪bw4图像的边界线。如下所示:
BW = bwtraceboundary(bw4,[25 25],'NW',8);
imshow(bw4); hold on;
plot(BW(:,2),BW(:,1),'r','LineWidth',1.5);
hold off;
运行结果如下图所示。可以看出,bwtraceboundary函数成功地跟踪了边界线。
从实际应用来看,MATLAB中的bwtraceboundary函数非常适合于跟踪二值图像中的边界线,特别是在数字图像处理和计算机视觉领域中。我们只需要输入起始坐标,并配置一些参数,就可以快速高效地得到边界线的坐标序列。